<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Function对象</title>
    <script >

        /*
            Function：函数(方法)对象
                1. 创建：
                    1. var fun = new Function(形式参数列表,方法体);

                    2. function 方法名称(形式参数列表){
                            方法体
                        }

                    3. var 方法名 = function(形式参数列表){
                            方法体
                       }
                2. 特点：
                    1. 方法定义是，形参的类型不用写,返回值类型也不写。
                    2. 方法是一个对象，如果定义名称相同的方法，会覆盖
                    3. 在JS中，方法的调用只与方法的名称有关，和参数列表无关。
                    4. 在方法声明中有一个隐藏的内置对象（数组），arguments,封装所有的实际参数
         */

        //1.创建方式1
        var fun1 = new Function("a","b","c","alert(a);");

        //2. 创建方式2
        function fun2(a , b){
            this.a = a;
            this.b = b;
            alert(a + b);
            // 实例方法，通过对象名调用
            this.doSome = function (){
                console.log("doSome" + a);
            }
            // 静态方法，通过类名直接调用
            fun2.doOther = function (){
                console.log("doOther....")
            }
        }
        var fun = new fun2(11,22);

        //3. 创建方式3
        var fun3 = function(a,b){
            alert(a+b);
        }

        //fun2(3,4);
        //alert(fun2.length);
        // fun1(3,4);
        //alert(fun1.length);//length:代表形参的个数

        /**
        *   会覆盖fun2
        */
        function fun2(a , b){
            //alert(a - b);
            alert(a);
            alert(b);
        }

        //fun2(3,4);
        //方法调用只与方法的名称有关，和参数列表无关。
        //fun2(1,2);
        //fun2(1);
        //fun2();
        //fun2(1,2,3);


        /*
         * 求两个数的和
         */
        /*function  add(a , b){
            return a + b;
        }*/
        /**
         * 求任意个数的和
         * 在方法声明中有一个隐藏的内置对象（数组），arguments,封装所有的实际参数
         */
        function add (){
            var sum = 0;
            for (var i = 0; i < arguments.length; i++) {
                sum += arguments[i];
            }
            return sum;
        }

        var sum = add(1,2,3,4);
        alert(sum);
        //add(1,3);

    </script>
</head>
<body>

</body>
</html>